<?php

namespace plugin\admin\app\exception;

use App\Common\Lib\Common;
use App\Common\Lib\Translate;
use Exception;

class BaseException extends Exception
{
    //默认的系统错误编码
    public $defaultCode = 500;
    //默认的系统错误信息
    public $defaultMsg = 'SYSTEM_ERROR';

    protected $_codeList = array(
        500 => 'SYSTEM_ERROR',
        501 => 'DATABASE_ERROR',
        502 => 'API_ERROR',
        505 => '非法请求',

        600 => 'PARAMETER_MISSING',
        601 => 'SIGN_KEY_NOT_EXIST',
        602 => 'SIGN_FAILED',
    );

    function __construct($code, $message=null)
    {
        //如果已经定义了错误编码，则获取对应的错误信息
        if (isset($this->_codeList[$code])) {

            $format = $this->_codeList[$code];

            //如果未定义错误编码，则默认错误信息
        }else if (is_numeric($code)) {

            $format = !empty($message) ? $message : $this->defaultMsg;

            //如果编码位置参数传递的是字符串，则调换编码和错误的信息参数位置
        }else if (is_string($code)) {

            $format = $code;
            $code = is_numeric($message) ? $message : $this->defaultCode;

            //定义默认的错误编码和错误信息
        }else {

            $code = $this->defaultCode;
            $format = $this->defaultMsg;
        }

        //应用语言包格式化输出内容
        //empty($format) || $format = lang($format);

        //如果存在替换字符，并且有传递错误信息，则执行字符替换
        if (strpos($format, '%') !== false && $message!==null){

            $message = sprintf($format, $message);

            //如果没有传递错误信息或者不存在替换字符，则错误信息为错误编码对应的信息
        }else {

            $message = $format;
        }

        //注意这里两个参数的位置不同
        parent::__construct($message, $code);
    }

}
